{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Activation Functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:65: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "fig, axs = plt.subplots(1, 4, figsize=(16, 4))\n",
    "\n",
    "theta = np.arange(-10, 10, 0.05)\n",
    "identity = theta\n",
    "logistic = 1 / (1 + np.exp(-1 * theta))\n",
    "relu = np.maximum(0, theta)\n",
    "tanh = np.tanh(theta)\n",
    "\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'identity': identity\n",
    "    }\n",
    ").plot(\n",
    "    title='Identity', \n",
    "    kind='scatter', x='theta', y='identity', \n",
    "    color='k',\n",
    "    ax=axs[0]\n",
    ")\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'relu': relu\n",
    "    }\n",
    ").plot(\n",
    "    title='Relu', \n",
    "    kind='scatter', x='theta', y='relu', \n",
    "    color='k',\n",
    "    ax=axs[1]\n",
    ")\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'logistic': logistic\n",
    "    }\n",
    ").plot(\n",
    "    title='Logistic', \n",
    "    kind='scatter', x='theta', y='logistic', \n",
    "    color='k',\n",
    "    ax=axs[2]\n",
    ")\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'tanh': tanh\n",
    "    }\n",
    ").plot(\n",
    "    title='tanh', \n",
    "    kind='scatter', x='theta', y='tanh', \n",
    "    color='k',\n",
    "    ax=axs[3]\n",
    ")\n",
    "\n",
    "for i in range(4):\n",
    "    axs[i].set_xlabel('Input')\n",
    "    axs[i].set_ylabel('Output')\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ReLU"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def leaky_relu(X):\n",
    "    x_min = 0.1 * np.array(X)\n",
    "    return np.clip(X, x_min, np.finfo(X.dtype).max)\n",
    "\n",
    "def inplace_leaky_relu_derivative(Z, delta):\n",
    "    delta[Z == 0] = 0.1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fecd8e2fbe0>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "fig, axs = plt.subplots(1, 2, figsize=(16, 4))\n",
    "\n",
    "theta = np.arange(-10, 10, 0.05)\n",
    "lrelu = leaky_relu(theta)\n",
    "relu = np.maximum(0, theta)\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'relu': relu\n",
    "    }\n",
    ").plot(\n",
    "    title='Relu', \n",
    "    kind='scatter', x='theta', y='relu', \n",
    "    color='k',\n",
    "    ax=axs[0]\n",
    ")\n",
    "\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'theta': theta,\n",
    "        'leaky_relu': lrelu\n",
    "    }\n",
    ").plot(\n",
    "    title='Leaky Relu', \n",
    "    kind='scatter', x='theta', y='leaky_relu', \n",
    "    color='k',\n",
    "    ax=axs[1]\n",
    ")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convex Function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/tarek/anaconda3/envs/scikitbook/lib/python3.6/site-packages/ipykernel_launcher.py:42: UserWarning: Matplotlib is currently using module://ipykernel.pylab.backend_inline, which is a non-GUI backend, so cannot show the figure.\n"
     ]
    },
    {
     "data": {
      "image/png": "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ERER0QvKmzcvRowYoYmtWrUKv//+u04ZERER2QYWGYiIiIhegp+fH8qWLauJDR8+HElJSTplREREpD8WGYiIiIheQsaMGTFp0iRN7JdffsG3336rU0ZERET6Y5GBiIiI6CXVrVsXXl5emlhgYCDu37+vU0ZERETp6/r168/czyIDERER0SuYOHEiMmfOnPw6MjISX3/9tY4ZERERWYZSChEREdi8eTOGDh2KypUr46233nrmezJYKTciIiIih1S8eHH06dNHU1iYN28eOnXqhJIlS+qYGRERkXmUUoiKisLFixdx8eJFhIeH48SJEzh+/Diio6Nf6FwsMhARERG9ooEDB2L16tX4559/AABxcXEYOXIk1q5dq3NmRERE/4mOjsbFixdx4cKF5ILCxYsXcenSJcTExFjkGiwyEBEREb2i7NmzY9y4cfDz80uOhYWFYffu3WjQoIGOmRERkTOKjo7GiRMncPLkSZw7dy65sBAVFfXK53Z1dX3mfhYZiIiIiCygdevWWLJkCY4cOZIc8/f3R+3atZEpUyYdMyMiIkeWlJSEM2fOYN++fTh27BhOnDiBiIgIi50/R44cqFChAipVqoQPP/wQNWrUeObxLDIQERERWYCIYNKkSahbty6UUgCACxcuYOHChejbt6/O2RERkSN58OABdu3ahW3btmHfvn24ffv2K58za9asKFGiBEqVKoWSJUuiXLlyqFSpEkqUKAEXF/PXjGCRgYiIiMhCKlWqhM6dOyM4ODg5NmXKFLRt2xb58+fXMTMiIrJ38fHx2LFjB7799lvs2bMHjx49euFzZMyYESVKlEDJkiWTiwlPtgIFCkBEXjlPFhmIiIiILCggIACbNm1KnkDr/v37GDduHL755hudMyMiInt07do1LF++HCtXrkRkZKRZ73F1dUXZsmVRqVIlvP322yhTpgxKlSqFIkWKPHdOhVfFIgMRERGRBeXJkwf+/v7w9/dPjoWEhKBbt2549913dcyMiIjsyaVLlzBt2jSsXbsWiYmJzzzW3d0dNWrUQK1atVClShW89dZbyJIli5Uy1WKRgYiIiMjCfH19ERwcjD///DM5Nnz4cISFhb3QuFYiInI+ERERmDRpEtatW/fM4kLRokXRrFkzNG3aFO+99x4yZLCNP++t8pQTkaUiclNE/pcilktEdotIuPHra9bIhYiIiJyP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/HjKlSuXq+3333/nhRdeoF27dm5n3xURKQo8OXvh22+/5amnntJs4cVb3wvuKxcRwTEZ5NixYxk8eHCu/ZmZmQwePJi//e1vfveF0+HDh+ncuTMvv/wymZmZudqaNGlCUlIStWvX9lF0IuKpSxUZLiwRqmRYhBhj6Nu3LytWrMhecianlStXcs899zBhwgSXX9QiIr60b98+unbtesmzFyIjI30UoRQhykVE8mCM4dVXX+X11193+WZ/zJgx9OzZkxMnTvgousuzcOFC7r77bhITE13ahg4dyrx587jhhhsKPzARuWyXKjLYS9yXIqBy5cp88cUXTJgwwWWuhtOnT/Pyyy/TokULNm7c6KMIRUQcMjMzeffdd4mJiSE+Pt6lXWcviBvKRUQuwhjDwIED+eijjwgJCcnVtmjRIpo2bcrmzZt9FN2lpaamMmTIEHr37u1SdA4NDeWTTz5h1KhRlCzp0aJ4IlIEXKrIcJUxZtn5DSiX875znxQBxhh69+7NypUr3a4bv2nTJpo3b87w4cNJTU31QYQiUtxt3LiRFi1aMHLkSH7//fdcbTp7QS5CuYiIBzp06MD777/P9ddfn2v/Tz/9RKtWrZg2bRrWFq0a3TfffEN0dDQfffSRS9s999zDd999R7t27XwQmYjkx6VKgv0vuD+toAIR76hUqRKzZ8/m3//+NyNGjCAlJSW7LSsri0mTJrFw4UJGjx6tX9oiUihOnTrF3//+d95//3231wfffffdjB8/XsUFyYtyEREP1apVi4SEBPr27cv69euz96enp/Pss8+yYMEC3nnnHapUqeLDKOHQoUMMHz6cBQsWuLQFBwczcuRIBg0apDPaRPzURYsM1lrXsqIUecYYevToQYsWLXjxxRf54osvcrX//PPP9OzZk/bt2zN69GjCw8N9FKmIBLolS5bw7LPPcuDAAZe20NBQXnvtNXr16kWJEh6tqCzFkHIRkctz8803s2jRIl566SWmTp2aqy0pKYnGjRszatQo/vSnPxX6H/Gpqam8/fbbvPfee5w+fdqlvXr16kyZMoU6deoUalwi4l3K6gLYjTfeyLRp05gzZw4333yzS/tXX31Fo0aNmDRpkiaGFBGv2rdvHz179qRr165uCwwPPfQQ33//PY888ogKDCIiXhYSEsKYMWOYPHkyV199da62U6dO8dxzz9GkSRO3kywWhNOnTzN16lTq1avHmDFjXAoMQUFBDB06lKSkJBUYRAKAMrti4L777mPlypUMGTLEpWKdmprK8OHDuffee/nuu+98FKGIBIr09HRGjx5No0aN3C5LGRERwezZs5k2bRo33nijDyIUESk+unXrxnfffUdsbKxLW3JyMh07dqRNmzYsXbq0QOZr+O9//8vo0aOpVasWw4YN49dff3XpU69ePRITExk1ahRXXXWV12MQkcKnIkMxUbZsWf7617+SmJhI/fr1XdqTk5Np164djz76KIcOHfJBhCLi7+Li4oiJieGNN94gPT09V1uJEiUYOHAgq1atolWrVj6KUESk+KlSpQrz589n3LhxLmc1gGPJ806dOhETE8OkSZM4duxYvn7euXPnSExM5IknnqBmzZq88cYbbp+zYsWKjB07lvj4eGrVqpWvnykiRYuKDMVMrVq1WLJkCW+99RblypVzaf/8889p0KAB48ePJyMjwwcRioi/+emnn+jevTvdunVj7969Lu1RUVEkJCTw+uuvu01wRUSkYBlj6NevH6tXr6Zbt25u+/z4448MHz6cyMhI2rZty7hx41ixYoXLakAXyszMZNu2bcyYMYNHH32UatWq0bFjR2bNmuX2sWXKlGHYsGGsX7+e/v37a3JHkQDk0YKzxphngARr7UZjTDQwGzgH9LDWrizIAMX7goKCeOyxx3jggQd45ZVX+Oyzz3K1p6Wl8corrzBz5kz+8Y9/0KJFCx9FKiJFWVpaGu+88w7jx4/nzJkzLu3XXXcdr7zyCj179tS8C5JvykVE8q9SpUpMnjyZxx9/nNdff52EhASXPllZWaxYsYIVK1Zk7wsLC6Ny5cpcc801lC5dmoyMDE6dOsWhQ4c4ePCgR3N7lStXjj59+jBgwABNOi4S4DwqMgBD+d+SUX8H/gmkAuOBRvkNwhgTBKwFfrbWts/v84lnbrrpJiZNmkTfvn157rnn2LJlS672Xbt28dBDD9GmTRteffVVqlev7qNIRaQoycrKYtasWbz22mtuL68qUaIE/fv356WXXqJ8+fI+iFAClHIRES+pX78+c+fOZe3atbz99tt88803nDt3Ls/+hw8f5vDhw1f0sypVqsQTTzxBnz59CA0NvdKQRcSPePrVUqi1NsUYUw6oDUyw1k4D/uClOIYAP3jpueQyRUdHk5iYyNixY93+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4Ycfsv89ePBgvn5WWloaaWlp7N+/P1/PU7JkSYKDgwFHQSErKwtrbfZ2/r4vlSpVittuuy17XovzhYXw8HAVFETkopSLiIiIeJevz2TIZoy5BagLrPZtJCKFq3Tp0tx1113cddddufafOHGCXbt2sXv3bnbv3s3evXuzb19qVQtvyszM9PgSj4JkjCE8PJxbbrmF6tWrZ2+RkZFUrlyZoKAgX4coIn5OuYiIiEj+GV9/AwlgjLkaSAJet9bOPb8/JSUlOzhdIy3iYK0lJSWFQ4cOcfTo0eztyJEj2bf/+9//FonCwOUIDQ3l2muvzb7EIzw8nPDwcMLCwggLC+PGG2/MPqNCpLjLOTFpaGioTtfxAuUiIiIinrtYLuLzIoMxJhj4Coiz1v4zZ1vOD/ZAt3PnzoCfzV7HWHjOFyKOHTvGsWPH+PXXXzl+/Di//vorJ0+eJDU1Ndd2fl9GRgZnzpzh7NmzZGRkkJGR4dHPCw4OpkyZMpQuXZrSpUtn377qqqsIDQ0lNDSU8uXL5/q3QoUK3HTTTdxwww1UrFiRkJCQAv5f8VxRGceCpGMMHCoy5J9ykeLxftExBobicIy2VahbAAAKB0lEQVRQPI5Txxg4LsxFfL26hAGmAT9c+KEuIlfOGEP58uUpX7481apVu+LnsdaSmZmZXWwwxrBnzx6qV6+OMQZjDCVKlNClCiLit5SLiIiIeJev52RoDPQGthhjNjr3vWit/caHMYmIkzGG4ODgXJcphISEFKmzDkRE8km5iIiIiBf5enWJ5YBO8xQRERGfUC4iIiLiXSV8HYCIiIiIiIiIBAYVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1RkEBERERERERGvUJFBRERERERERLxCRQYRERERERER8QoVGURERERERETEK1Rk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\n",
      "text/plain": [
       "<Figure size 1152x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "w = np.arange(-10, 10, 0.05)\n",
    "y1 = np.sin(w)\n",
    "y2 = 2 + (0.25*w)**2\n",
    "y3 = (0.01*w) ** 3\n",
    "\n",
    "y_convex = y2\n",
    "y_nonconvex = 3 + y1 + y2 + y3\n",
    "\n",
    "\n",
    "fig, axs = plt.subplots(1, 2, figsize=(16, 4))\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'w': w,\n",
    "        'y': y_convex,\n",
    "    }\n",
    ").set_index('w')['y'].plot(\n",
    "    title='Convex Function',\n",
    "    ylim=(0,12),\n",
    "    color='k',\n",
    "    ax=axs[0]\n",
    ")\n",
    "\n",
    "axs[0].set_ylabel('Loss Function, J(w)')\n",
    "\n",
    "pd.DataFrame(\n",
    "    {\n",
    "        'w': w,\n",
    "        'y': y_nonconvex,\n",
    "    }\n",
    ").set_index('w')['y'].plot(\n",
    "    title='Non-convex Function',\n",
    "    ylim=(0,12),\n",
    "    color='k',\n",
    "    ax=axs[1]\n",
    ")\n",
    "\n",
    "axs[1].set_ylabel('Loss Function, J(w)')\n",
    "\n",
    "\n",
    "\n",
    "fig.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
